package jdk8.optionalapi;

import java.util.Optional;

/**
 * Description: jdk1.8新特性：Optional
 * Java应用中最常见的bug就是空值异常。
 * 在Java 8之前，Google Guava引入了Optionals类来解决NullPointerException，从而避免源码被各种null检查污染，以便开发者写出更加整洁的代码。
 * Java 8也将Optional加入了官方库。Optional仅仅是一个容器：存放T类型的值或者null。它提供了一些有用的接口来避免显式的null检查。
 * 
 * 个人认为：一般有用吧，跟之前的isEmpty()、!=null 方法判断有点类似
 * @author Kwum
 * @date 2017年6月28日 下午3:03:41
 * @version 1.0
 */

public class Run {

    public static void main(String[] args) {
        
        Optional<String> nullString = Optional.ofNullable(null);
        //如果Optional实例持有一个非空值，则isPresent()方法返回true，否则返回false
        //本例是空值
        System.out.println( "NullString is set? " + nullString.isPresent() );
        
        //Optional实例持有null，则可以接受一个lambda表达式生成的默认值
        //本例是空值
        System.out.println( "NullString: " + nullString.orElseGet( () -> "[none]" ) );
        
        //map()方法可以将现有的Opetional实例的值转换成新的值；
        //orElse()方法与orElseGet()方法类似，但是在持有null的时候返回传入的默认值。
        //本例是空值
        System.out.println( nullString.map( s -> "Hey " + s + "!" ).orElse( "Hey Stranger!" ) );
        
        Optional<String> notNullString = Optional.ofNullable("Tony");
        //如果Optional实例持有一个非空值，则isPresent()方法返回true，否则返回false
        //本例是Tony
        System.out.println( "NotNullString is set? " + notNullString.isPresent() );
        
        //Optional实例持有null，则可以接受一个lambda表达式生成的默认值
        //本例是Tony
        System.out.println( "NotNullString: " + notNullString.orElseGet( () -> "[none]" ) );
        
        //map()方法可以将现有的Opetional实例的值转换成新的值；
        //orElse()方法与orElseGet()方法类似，但是在持有null的时候返回传入的默认值。
        //本例是Tony
        System.out.println( notNullString.map( s -> "Hey " + s + "!" ).orElse( "Hey Stranger!" ) );

    }

}
